#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据分析模块
专门负责数据处理、统计分析和计算功能
"""

import pandas as pd
import numpy as np

class EpidemicDataAnalyzer:
    """疫情数据分析器"""
    
    def __init__(self, data=None):
        """
        初始化数据分析器
        
        Args:
            data (pd.DataFrame): 要分析的数据
        """
        self.data = data
        self.daily_stats = None
        
    def set_data(self, data):
        """设置要分析的数据"""
        self.data = data
        
    def calculate_daily_confirmed_cases(self):
        """计算每日确诊病例数据"""
        if self.data is None:
            print("❌ 请先设置数据")
            return None
        
        print("\n" + "="*60)
        print("🔬 每日确诊病例数据分析")
        print("="*60)
        
        # 转换日期格式
        self.data['报告日期'] = pd.to_datetime(self.data['报告日期'])
        
        # 按日期汇总每日新增确诊和累计确诊
        self.daily_stats = self.data.groupby('报告日期').agg({
            '新增确诊': 'sum',
            '累计确诊': 'sum',
            '现存确诊': 'sum',
            '新增康复': 'sum',
            '累计康复': 'sum',
            '新增死亡': 'sum',
            '累计死亡': 'sum'
        }).reset_index()
        
        # 计算每日变化率
        self.daily_stats['新增确诊变化率'] = self.daily_stats['新增确诊'].pct_change() * 100
        self.daily_stats['累计确诊增长率'] = self.daily_stats['累计确诊'].pct_change() * 100
        
        # 显示前20天的数据
        print("\n📈 前20天确诊病例数据:")
        print(self.daily_stats.head(20).to_string(index=False))
        
        # 统计信息
        print(f"\n📊 确诊病例统计信息:")
        print(f"数据时间范围: {self.daily_stats['报告日期'].min().strftime('%Y-%m-%d')} 至 {self.daily_stats['报告日期'].max().strftime('%Y-%m-%d')}")
        print(f"总天数: {len(self.daily_stats)} 天")
        print(f"总新增确诊: {self.daily_stats['新增确诊'].sum():,} 例")
        print(f"总累计确诊: {self.daily_stats['累计确诊'].max():,} 例")
        print(f"平均每日新增: {self.daily_stats['新增确诊'].mean():.1f} 例")
        print(f"最高单日新增: {self.daily_stats['新增确诊'].max():,} 例")
        print(f"最低单日新增: {self.daily_stats['新增确诊'].min():,} 例")
        
        # 计算关键指标
        max_new_cases_day = self.daily_stats.loc[self.daily_stats['新增确诊'].idxmax()]
        min_new_cases_day = self.daily_stats.loc[self.daily_stats['新增确诊'].idxmin()]
        
        print(f"\n🏆 关键日期:")
        print(f"单日新增最高: {max_new_cases_day['报告日期'].strftime('%Y-%m-%d')} ({max_new_cases_day['新增确诊']:,} 例)")
        print(f"单日新增最低: {min_new_cases_day['报告日期'].strftime('%Y-%m-%d')} ({min_new_cases_day['新增确诊']:,} 例)")
        
        return self.daily_stats
    
    def get_daily_stats(self):
        """获取每日统计数据"""
        return self.daily_stats
    
    def calculate_regional_stats(self):
        """计算各区统计数据"""
        if self.data is None:
            print("❌ 请先设置数据")
            return None
        
        print("\n" + "="*60)
        print("🏘️ 各区疫情统计分析")
        print("="*60)
        
        # 按地区汇总统计
        regional_stats = self.data.groupby('地区名称').agg({
            '新增确诊': 'sum',
            '累计确诊': 'max',
            '现存确诊': 'max',
            '累计康复': 'max',
            '累计死亡': 'max',
            '人口': 'max'
        }).reset_index()
        
        # 计算各区发病率
        regional_stats['发病率(每10万人)'] = (regional_stats['累计确诊'] / regional_stats['人口'] * 100000)
        
        # 计算康复率和死亡率
        regional_stats['康复率'] = (regional_stats['累计康复'] / regional_stats['累计确诊'] * 100).fillna(0)
        regional_stats['死亡率'] = (regional_stats['累计死亡'] / regional_stats['累计确诊'] * 100).fillna(0)
        
        # 排序并显示
        regional_stats_sorted = regional_stats.sort_values('累计确诊', ascending=False)
        
        print("\n📊 各区累计确诊排名:")
        print(regional_stats_sorted[['地区名称', '累计确诊', '发病率(每10万人)', '康复率', '死亡率']].to_string(index=False))
        
        return regional_stats
    
    def calculate_time_period_stats(self, start_date=None, end_date=None):
        """计算指定时间段的统计数据"""
        if self.data is None:
            print("❌ 请先设置数据")
            return None
        
        # 转换日期格式
        self.data['报告日期'] = pd.to_datetime(self.data['报告日期'])
        
        # 过滤时间范围
        if start_date:
            start_date = pd.to_datetime(start_date)
            period_data = self.data[self.data['报告日期'] >= start_date]
        else:
            period_data = self.data
            
        if end_date:
            end_date = pd.to_datetime(end_date)
            period_data = period_data[period_data['报告日期'] <= end_date]
        
        # 计算统计信息
        period_stats = {
            '时间段': f"{period_data['报告日期'].min().strftime('%Y-%m-%d')} 至 {period_data['报告日期'].max().strftime('%Y-%m-%d')}",
            '总新增确诊': period_data['新增确诊'].sum(),
            '总累计确诊': period_data['累计确诊'].max(),
            '总累计康复': period_data['累计康复'].max(),
            '总累计死亡': period_data['累计死亡'].max(),
            '平均每日新增': period_data.groupby('报告日期')['新增确诊'].sum().mean(),
            '最高单日新增': period_data.groupby('报告日期')['新增确诊'].sum().max(),
            '最低单日新增': period_data.groupby('报告日期')['新增确诊'].sum().min()
        }
        
        print(f"\n📅 时间段统计: {period_stats['时间段']}")
        print(f"总新增确诊: {period_stats['总新增确诊']:,} 例")
        print(f"总累计确诊: {period_stats['总累计确诊']:,} 例")
        print(f"平均每日新增: {period_stats['平均每日新增']:.1f} 例")
        print(f"最高单日新增: {period_stats['最高单日新增']:,} 例")
        print(f"最低单日新增: {period_stats['最低单日新增']:,} 例")
        
        return period_stats 